Reactã®useMemoããã¯ããã¹ã¿ãŒããé«ã³ã¹ããªèšç®ããã£ãã·ã¥ããŠäžèŠãªåã¬ã³ããªã³ã°ãé²ãããã©ãŒãã³ã¹ãæé©åãReactã¢ããªã±ãŒã·ã§ã³ã®é床ãšå¹çãåäžãããŸãã
React useMemo: ã¡ã¢åã«ããããã©ãŒãã³ã¹ã®æé©å
Reactéçºã®äžçã§ã¯ãããã©ãŒãã³ã¹ãæãéèŠã§ããã¢ããªã±ãŒã·ã§ã³ãè€éã«ãªãã«ã€ããŠãã¹ã ãŒãºã§å¿çæ§ã®é«ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã確ä¿ããããšããŸããŸãéèŠã«ãªããŸããReactã®ããã©ãŒãã³ã¹æé©åã®ããã®åŒ·åãªããŒã«ã®äžã€ãuseMemoããã¯ã§ãããã®ããã¯ã䜿çšãããšãé«ã³ã¹ããªèšç®ã®çµæãã¡ã¢åãã€ãŸããã£ãã·ã¥ããããšãã§ããäžèŠãªåèšç®ãé²ããã¢ããªã±ãŒã·ã§ã³ã®å¹çãåäžãããããšãã§ããŸãã
ã¡ã¢åãçè§£ãã
æ žå¿ãšããŠãã¡ã¢åãšã¯ãé«ã³ã¹ããªé¢æ°åŒã³åºãã®çµæãä¿åããåãå ¥åãåã³çºçãããšãã«ãã£ãã·ã¥ãããçµæãè¿ãããšã«ãã£ãŠé¢æ°ãæé©åããææ³ã§ããèšç®ãç¹°ãè¿ãå®è¡ãã代ããã«ã颿°ã¯ä»¥åã«èšç®ãããå€ãååŸããã ãã§ããããã«ãããç¹ã«é¢æ°ãè€éãªèšç®ãå€§èŠæš¡ãªããŒã¿ã»ãããæ±ãå Žåã«ã颿°ã®å®è¡ã«å¿ èŠãªæéãšãªãœãŒã¹ãå€§å¹ ã«åæžã§ããŸãã
æ°å€ã®éä¹ãèšç®ãã颿°ããããšæ³åããŠã¿ãŠãã ããã倧ããªæ°ã®éä¹ãèšç®ããããšã¯ãèšç®éãå€ããªãå¯èœæ§ããããŸããã¡ã¢åã¯ããã§ã«èšç®ãããåæ°å€ã®éä¹ãä¿åããããšã§åœ¹ç«ã¡ãŸããæ¬¡åãåãæ°å€ã§é¢æ°ãåŒã³åºããããšããåèšç®ãã代ããã«ä¿åãããçµæãåçŽã«ååŸã§ããŸãã
React useMemoã®ç޹ä»
Reactã®useMemoããã¯ã¯ã颿°ã³ã³ããŒãã³ãå
ã§å€ãã¡ã¢åããæ¹æ³ãæäŸããŸããããã¯2ã€ã®åŒæ°ãåãåããŸãïŒ
- èšç®ãå®è¡ãã颿°ã
- äŸåé åã
useMemoããã¯ã¯ãé
åå
ã®äŸåé¢ä¿ã®ããããã倿Žãããå Žåã«ã®ã¿é¢æ°ãåå®è¡ããŸããäŸåé¢ä¿ãåããŸãŸã§ããã°ãåã®ã¬ã³ããªã³ã°ãããã£ãã·ã¥ãããå€ãè¿ããŸããããã«ããã颿°ãäžå¿
èŠã«å®è¡ãããã®ãé²ããç¹ã«é«ã³ã¹ããªèšç®ãæ±ãå Žåã«ããã©ãŒãã³ã¹ã倧å¹
ã«åäžãããããšãã§ããŸãã
useMemoã®æ§æ
useMemoã®æ§æã¯ç°¡åã§ãïŒ
const memoizedValue = useMemo(() => {
// ããã§é«ã³ã¹ããªèšç®ãè¡ã
return computeExpensiveValue(a, b);
}, [a, b]);
ãã®äŸã§ã¯ãcomputeExpensiveValue(a, b)ãé«ã³ã¹ããªèšç®ãå®è¡ãã颿°ã§ããé
å[a, b]ã¯äŸåé¢ä¿ãæå®ããŸããuseMemoããã¯ã¯ãaãŸãã¯bã®ããããã倿Žãããå Žåã«ã®ã¿computeExpensiveValue颿°ãåå®è¡ããŸãããã以å€ã®å Žåã¯ãåã®ã¬ã³ããªã³ã°ãããã£ãã·ã¥ãããå€ãè¿ããŸãã
useMemoã䜿çšããå Žé¢
useMemoã¯ã次ã®ã·ããªãªã§æãæçã§ãïŒ
- é«ã³ã¹ããªèšç®ïŒè€éãªããŒã¿å€æãå€§èŠæš¡ãªããŒã¿ã»ããã®ãã£ã«ã¿ãªã³ã°ãªã©ãèšç®è² è·ã®é«ãã¿ã¹ã¯ãå®è¡ãã颿°ãããå Žåã
- åç
§ã®ç䟡æ§ãã§ãã¯ïŒç¹ã«
React.memoã䜿çšããåã³ã³ããŒãã³ãã«å€ãpropsãšããŠæž¡ãéã«ãå€ããã®åºã«ãªãäŸåé¢ä¿ã倿Žãããå Žåã«ã®ã¿å€æŽãããããã«ããå¿ èŠãããå Žåã - äžèŠãªåã¬ã³ããªã³ã°ã®é²æ¢ïŒã³ã³ããŒãã³ãããã®propsãstateãå®éã«å€æŽãããªãéãåã¬ã³ããªã³ã°ãããã®ãé²ãããå Žåã
ãããã®åã·ããªãªãå®è·µçãªäŸã§è©³ããèŠãŠãããŸãããã
ã·ããªãª1ïŒé«ã³ã¹ããªèšç®
ç¹å®ã®åºæºã«åºã¥ããŠãŠãŒã¶ãŒããŒã¿ã®å€§èŠæš¡ãªé åããã£ã«ã¿ãªã³ã°ããå¿ èŠãããã·ããªãªãèããŠã¿ãŸããããå€§èŠæš¡ãªé åã®ãã£ã«ã¿ãªã³ã°ã¯ãç¹ã«ãã£ã«ã¿ãªã³ã°ããžãã¯ãè€éãªå Žåãèšç®ã³ã¹ããé«ããªãå¯èœæ§ããããŸãã
const UserList = ({ users, filter }) => {
const filteredUsers = useMemo(() => {
console.log('ãŠãŒã¶ãŒããã£ã«ã¿ãªã³ã°äž...'); // é«ã³ã¹ããªèšç®ãã·ãã¥ã¬ãŒã
return users.filter(user => user.name.toLowerCase().includes(filter.toLowerCase()));
}, [users, filter]);
return (
{filteredUsers.map(user => (
- {user.name}
))}
);
};
ãã®äŸã§ã¯ãfilteredUsers倿°ã¯useMemoã䜿çšããŠã¡ã¢åãããŠããŸãããã£ã«ã¿ãªã³ã°ããžãã¯ã¯ãusersé
åãŸãã¯filterã®å€ã倿Žãããå Žåã«ã®ã¿åå®è¡ãããŸããusersé
åãšfilterã®å€ãåããŸãŸã§ããã°ãuseMemoããã¯ã¯ãã£ãã·ã¥ãããfilteredUsersé
åãè¿ãããã£ã«ã¿ãªã³ã°ããžãã¯ãäžå¿
èŠã«åå®è¡ãããã®ãé²ããŸãã
ã·ããªãª2ïŒåç §ã®ç䟡æ§ãã§ãã¯
React.memoã䜿çšããåã³ã³ããŒãã³ãã«å€ãpropsãšããŠæž¡ãå Žåããã®propsãåºã«ãªãäŸåé¢ä¿ã倿Žããããšãã«ã®ã¿å€æŽãããããšã確èªããããšãéèŠã§ããããããªããšã衚瀺ãããããŒã¿ãå€ãã£ãŠããªããŠããåã³ã³ããŒãã³ããäžå¿
èŠã«åã¬ã³ããªã³ã°ãããå¯èœæ§ããããŸãã
const MyComponent = React.memo(({ data }) => {
console.log('MyComponentãåã¬ã³ããªã³ã°ãããŸããïŒ');
return {data.value};
});
const ParentComponent = () => {
const [a, setA] = React.useState(1);
const [b, setB] = React.useState(2);
const data = useMemo(() => ({
value: a + b,
}), [a, b]);
return (
);
};
ãã®äŸã§ã¯ãdataãªããžã§ã¯ãã¯useMemoã䜿çšããŠã¡ã¢åãããŠããŸããReact.memoã§ã©ãããããMyComponentã³ã³ããŒãã³ãã¯ãdata propã倿Žããããšãã«ã®ã¿åã¬ã³ããªã³ã°ãããŸããdataã¯ã¡ã¢åãããŠãããããaãŸãã¯bã倿Žããããšãã«ã®ã¿å€æŽãããŸããuseMemoããªãå ŽåãParentComponentãã¬ã³ããªã³ã°ããããã³ã«æ°ããdataãªããžã§ã¯ããäœæãããa + bã®valueãåããŸãŸã§ãã£ãŠãMyComponentãäžå¿
èŠã«åã¬ã³ããªã³ã°ãããåå ãšãªããŸãã
ã·ããªãª3ïŒäžèŠãªåã¬ã³ããªã³ã°ã®é²æ¢
ã³ã³ããŒãã³ãããã®propsãstateãå®éã«å€æŽãããªãéãåã¬ã³ããªã³ã°ãããã®ãé²ãããå ŽåããããŸããããã¯ãå€ãã®åã³ã³ããŒãã³ããæã€è€éãªã³ã³ããŒãã³ãã®ããã©ãŒãã³ã¹ãæé©åããã®ã«ç¹ã«åœ¹ç«ã¡ãŸãã
const MyComponent = ({ config }) => {
const processedConfig = useMemo(() => {
// configãªããžã§ã¯ããåŠçïŒé«ã³ã¹ããªæäœïŒ
console.log('configãåŠçäž...');
let result = {...config}; // åçŽãªäŸã§ãããè€éã«ãªãå¯èœæ§ããããŸã
if (result.theme === 'dark') {
result.textColor = 'white';
} else {
result.textColor = 'black';
}
return result;
}, [config]);
return (
{processedConfig.title}
{processedConfig.description}
);
};
const App = () => {
const [theme, setTheme] = React.useState('light');
const config = useMemo(() => ({
title: 'ãã€ã¢ããª',
description: 'ããã¯ãµã³ãã«ã¢ããªã§ãã',
theme: theme
}), [theme]);
return (
);
};
ãã®äŸã§ã¯ãprocessedConfigãªããžã§ã¯ãã¯config propã«åºã¥ããŠã¡ã¢åãããŠããŸããé«ã³ã¹ããªconfigåŠçããžãã¯ã¯ãconfigãªããžã§ã¯ãèªäœã倿ŽããããšãïŒã€ãŸããããŒãã倿ŽããããšãïŒã«ã®ã¿å®è¡ãããŸããéèŠãªã®ã¯ã`App`ã³ã³ããŒãã³ããåã¬ã³ããªã³ã°ããããã³ã«`config`ãªããžã§ã¯ããåå®çŸ©ãããã«ããããããã`useMemo`ã䜿çšããããšã§ã`config`ãªããžã§ã¯ãã¯`theme`倿°èªäœã倿Žããããšãã«ã®ã¿å®éã«*倿Ž*ãããããšãä¿èšŒãããç¹ã§ãã`App`ã³ã³ããŒãã³ãã§`useMemo`ããã¯ã䜿çšããªããšã`App`ãã¬ã³ããªã³ã°ããããã³ã«æ°ãã`config`ãªããžã§ã¯ããäœæãããåºã«ãªãããŒã¿ïŒããŒãïŒãå®éã«ã¯åãã§ãã£ãŠãã`MyComponent`ãæ¯å`processedConfig`ãåèšç®ããåå ãšãªããŸãã
é¿ããã¹ãããããééã
useMemoã¯åŒ·åãªããŒã«ã§ãããæ
éã«äœ¿çšããããšãéèŠã§ããã¡ã¢åãããå€ã管çãããªãŒããŒããããåèšç®ãåé¿ããå©ç¹ãäžåãå ŽåãuseMemoãé床ã«äœ¿çšãããšå®éã«ããã©ãŒãã³ã¹ãäœäžããå¯èœæ§ããããŸãã
- éå°ãªã¡ã¢åïŒãã¹ãŠãã¡ã¢åããªãã§ãã ããïŒæ¬åœã«èšç®ã³ã¹ããé«ãå€ããåç §ã®ç䟡æ§ãã§ãã¯ã§äœ¿çšãããå€ã®ã¿ãã¡ã¢åããŠãã ããã
- äžæ£ç¢ºãªäŸåé¢ä¿ïŒé¢æ°ãäŸåãããã¹ãŠã®äŸåé¢ä¿ãäŸåé åã«å«ããããã«ããŠãã ãããããããªããšãã¡ã¢åãããå€ãå€ããªããäºæããªãåäœã«ã€ãªããå¯èœæ§ããããŸãã
- äŸåé¢ä¿ã®å¿ãïŒäŸåé¢ä¿ãå¿ãããšã远跡ãå°é£ãªåŸ®åŠãªãã°ã«ã€ãªããå¯èœæ§ããããŸããäŸåé åãå®å šã§ããããšãåžžã«å確èªããŠãã ããã
- æ©ãããæé©åïŒæ©ãããæé©åã¯ããªãã§ãã ãããããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããå Žåã«ã®ã¿æé©åããŠãã ããããããã¡ã€ãªã³ã°ããŒã«ã䜿çšããŠãå®éã«ããã©ãŒãã³ã¹ã®åé¡ãåŒãèµ·ãããŠããã³ãŒãã®é åãç¹å®ããŸãã
useMemoã®ä»£æ¿ææ®µ
useMemoã¯å€ãã¡ã¢åããããã®åŒ·åãªããŒã«ã§ãããReactã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãæé©åããããã«äœ¿çšã§ããä»ã®ææ³ããããŸãã
- React.memoïŒ
React.memoã¯ã颿°ã³ã³ããŒãã³ããã¡ã¢åããé«éã³ã³ããŒãã³ãã§ããpropsã倿Žãããªãéããã³ã³ããŒãã³ããåã¬ã³ããªã³ã°ãããã®ãé²ããŸããããã¯ãåãpropsãç¹°ãè¿ãåãåãã³ã³ããŒãã³ãã®ããã©ãŒãã³ã¹ãæé©åããã®ã«åœ¹ç«ã¡ãŸãã - PureComponentïŒã¯ã©ã¹ã³ã³ããŒãã³ãçšïŒïŒ
React.memoãšåæ§ã«ãPureComponentã¯propsãšstateã®æµ ãæ¯èŒãè¡ããã³ã³ããŒãã³ããåã¬ã³ããªã³ã°ãããã¹ããã©ããã倿ããŸãã - ã³ãŒãåå²ïŒã³ãŒãåå²ã䜿çšãããšãã¢ããªã±ãŒã·ã§ã³ãããå°ããªãã³ãã«ã«åå²ãããªã³ããã³ãã§èªã¿èŸŒãããšãã§ããŸããããã«ãããã¢ããªã±ãŒã·ã§ã³ã®åæèªã¿èŸŒã¿æéãæ¹åãããè§£æã»å®è¡ãå¿ èŠãªã³ãŒãã®éãæžããããšãã§ããŸãã
- ãããŠã³ã¹ãšã¹ããããªã³ã°ïŒãããŠã³ã¹ãšã¹ããããªã³ã°ã¯ã颿°ãå®è¡ãããé »åºŠãå¶éããããã«äœ¿çšãããææ³ã§ããããã¯ãã¹ã¯ããŒã«ãã³ãã©ãŒããªãµã€ãºãã³ãã©ãŒãªã©ãé »ç¹ã«ããªã¬ãŒãããã€ãã³ããã³ãã©ãŒã®ããã©ãŒãã³ã¹ãæé©åããã®ã«åœ¹ç«ã¡ãŸãã
äžçäžã®å®è·µçãªäŸ
useMemoãäžçäžã®ããŸããŸãªã³ã³ããã¹ãã§ã©ã®ããã«é©çšã§ããããããã€ãã®äŸãèŠãŠã¿ãŸãããïŒ
- Eã³ããŒã¹ïŒã°ããŒãã«ïŒïŒã°ããŒãã«ãªEã³ããŒã¹ãã©ãããã©ãŒã ã§ã¯ãè€éãªè£œåã®ãã£ã«ã¿ãªã³ã°ããœãŒãæäœã®çµæããã£ãã·ã¥ããããã«
useMemoã䜿çšãããããããŸãããããã«ãããå Žæãã€ã³ã¿ãŒãããæ¥ç¶é床ã«é¢ä¿ãªããäžçäžã®ãŠãŒã¶ãŒã«é«éã§å¿çæ§ã®é«ãã·ã§ããã³ã°äœéšãä¿èšŒããŸããäŸãã°ãæ±äº¬ã®ãŠãŒã¶ãŒãäŸ¡æ Œåž¯ãåšåº«ç¶æ³ã§è£œåããã£ã«ã¿ãªã³ã°ããå Žåãã¡ã¢åããããã£ã«ã¿ãªã³ã°é¢æ°ã圹ç«ã¡ãŸãã - éèããã·ã¥ããŒãïŒåœéïŒïŒãªã¢ã«ã¿ã€ã ã®æ ªäŸ¡ãåžå ŽããŒã¿ã衚瀺ããéèããã·ã¥ããŒãã§ã¯ãç§»åå¹³åããã©ãã£ãªãã£ææšãªã©ã®éèææšã«é¢ããèšç®çµæããã£ãã·ã¥ããããã«
useMemoã䜿çšã§ããŸããããã«ããã倧éã®ããŒã¿ã衚瀺ããéã«ããã·ã¥ããŒããé ããªãã®ãé²ããŸãããã³ãã³ã§æ ªäŸ¡ã®ããã©ãŒãã³ã¹ãç£èŠããŠãããã¬ãŒããŒã¯ãããã¹ã ãŒãºãªæŽæ°ãäœéšã§ããŸãã - ãããã³ã°ã¢ããªã±ãŒã·ã§ã³ïŒå°åïŒïŒå°çããŒã¿ã衚瀺ãããããã³ã°ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãå°å³ã®æåœ±ã座æšå€æã«é¢ããèšç®çµæããã£ãã·ã¥ããããã«
useMemoã䜿çšã§ããŸããããã«ãããç¹ã«å€§èŠæš¡ãªããŒã¿ã»ãããè€éãªå°å³ã¹ã¿ã€ã«ãæ±ãå Žåã«ãå°å³ã®ãºãŒã ããã³æäœæã®ã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãåäžããŸããã¢ããŸã³ã®ç±åž¯éšæã®è©³çްãªå°å³ãæ¢çŽ¢ããŠãããŠãŒã¶ãŒã¯ãããé«éãªã¬ã³ããªã³ã°ãäœéšã§ããŸãã - èšèªç¿»èš³ã¢ããªïŒå€èšèªïŒïŒå€§éã®ç¿»èš³ããã¹ããåŠçããŠè¡šç€ºããå¿
èŠãããèšèªç¿»èš³ã¢ããªãæ³åããŠã¿ãŠãã ããã
useMemoã䜿çšããŠããã¹ãã®ãã©ãŒããããšã¬ã³ããªã³ã°ãã¡ã¢åããããšã§ã衚瀺ãããèšèªã«é¢ä¿ãªããã¹ã ãŒãºãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãä¿èšŒã§ããŸããããã¯ãäžåœèªãã¢ã©ãã¢èªã®ãããªè€éãªæåã»ãããæã€èšèªã§ã¯ç¹ã«éèŠã§ãã
çµè«
useMemoããã¯ã¯ãReactã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãæé©åããããã®è²ŽéãªããŒã«ã§ããé«ã³ã¹ããªèšç®ãã¡ã¢åããäžèŠãªåã¬ã³ããªã³ã°ãé²ãããšã§ãã³ãŒãã®é床ãšå¹çã倧å¹
ã«åäžãããããšãã§ããŸããããããuseMemoãæ
éã«äœ¿çšãããã®éçãçè§£ããããšãéèŠã§ããuseMemoãé床ã«äœ¿çšãããšå®éã«ããã©ãŒãã³ã¹ãäœäžããå¯èœæ§ããããããå®éã«ããã©ãŒãã³ã¹ã®åé¡ãåŒãèµ·ãããŠããã³ãŒãã®é åãç¹å®ãããããã®é åã«æé©åã®åªåãéäžãããããšãéèŠã§ãã
ã¡ã¢åã®ååãšuseMemoããã¯ã®å¹æçãªäœ¿ç𿹿³ãçè§£ããããšã§ãäžçäžã®ãŠãŒã¶ãŒã«ã¹ã ãŒãºã§å¿çæ§ã®é«ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸãã髿§èœãªReactã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸããã³ãŒãããããã¡ã€ãªã³ã°ããããã«ããã¯ãç¹å®ããæè¯ã®çµæãåŸãããã«æŠç¥çã«useMemoãé©çšããããšãå¿ããªãã§ãã ããã